﻿/*
 * Copyright (c) 2017, Peter Thorson. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of the WebSocket++ Project nor the
 *       names of its contributors may be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */

#ifndef AMO_THREAD_HPP
#define AMO_THREAD_HPP

//#define BOOST_NO_CXX11_HDR_THREAD
// - thread                   : building
#ifdef BOOST_NO_CXX11_HDR_THREAD
#include <amo/config.hpp>
#else
#include <thread>
#include <mutex>

#include <condition_variable>
#endif	//BOOST_NO_CXX11_HDR_THREAD

#include <sstream>

namespace amo {

#ifdef BOOST_NO_CXX11_HDR_THREAD
    using boost::mutex;
    using boost::recursive_mutex;
    using boost::lock_guard;
    using boost::thread;
    
    using boost::unique_lock;
    using boost::condition_variable;
    using boost::condition_variable_any;
    using boost::cv_status;
    namespace this_thread = boost::this_thread;
#else
    using std::mutex;
    using std::recursive_mutex;
    using std::lock_guard;
    using std::thread;
    using std::unique_lock;
    using std::condition_variable;
    using std::condition_variable_any;
    using std::cv_status;
    namespace this_thread = std::this_thread;
#endif	//BOOST_NO_CXX11_HDR_THREAD
    
    
} // namespace amo



namespace amo {
    static int32_t current_thread_id() {
        std::stringstream stream;
        stream << std::this_thread::get_id();
        int32_t thread_id = 0;
        stream >> thread_id;
        return thread_id;
    }
}
#endif // AMO_THREAD_HPP
